package control

import (
	"fmt"
	"io"
	"math/rand"
	"net/http"
	"os"
	"strings"
	"time"
)

// 用来处理图片视频语音上传逻辑

type AttachControl struct {
}

func init() {
	// 创建一个mnt目录,可包含多级子目录,权限为777
	os.MkdirAll("./mnt", os.ModePerm)
}

func (AttachControl) Upload(writer http.ResponseWriter, request *http.Request) {
	fmt.Println("进入control.Upload函数中")
	UploadLocal(writer, request)
}

// 1. 存储位置 ./mnt, 需要确保已经创建好, init方法启动时启动创建mnt目录
// 2. url格式 /mnt/xxx.png 需要确保网络能够访问到/mnt/, 静态资源目录,可在main中指定
func UploadLocal(writer http.ResponseWriter, request *http.Request) {

	// 1. 获取上传的源文件s, key=file是前端指定的
	// s_file:文件内容, h_file:文件信息
	s_file, h_file, err := request.FormFile("file")
	if err != nil {
		returnJson.ReturnJsonStr(writer, -1, err.Error(), nil)
		return
	}
	// 2. 创建一个新的文件d
	suffix := ".png"
	// 前端包含后缀,用前端信息
	filename_ := h_file.Filename
	tmp := strings.Split(filename_, ".")
	if len(tmp) > 1 {
		suffix = "." + tmp[len(tmp)-1]
	}
	// 如果不包含,取filetype
	filetype := request.FormValue("filetype")
	if len(filetype) > 0 {
		suffix = filetype
	}
	// time.Now().Unix()有可能相同, 增加随机数保证不相等
	filename := fmt.Sprintf("%d%04d%s", time.Now().Unix(), rand.Int31(), suffix)

	// 3.将源文件内容拷贝到新文件
	dstfile, err := os.Create("./mnt/" + filename)
	if err != nil {
		returnJson.ReturnJsonStr(writer, -1, err.Error(), nil)
		return
	}
	_, err = io.Copy(dstfile, s_file)
	if err != nil {
		returnJson.ReturnJsonStr(writer, -1, err.Error(), nil)
		return
	}
	// 4. 新文件路径转为url
	url := "/mnt/" + filename
	returnJson.ReturnJsonStr(writer, 0, "", url)

}
